/***************************************************************************
 *   Ants - library                                                        *
 *                                                                         *
 *   Copyright (C) 2008 by kuerant                                         *
 *                         <kuerant@gmail.com>                             *
 *                                                                         *
 *   This library is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU Library General Public License as       *
 *   published by the Free Software Foundation; either version 2 of the    *
 *   License, or (at your option) any later version.                       *
 *                                                                         *
 *   This library is distributed in the hope that it will be usefull, but  *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      *
 *   Library General Public License for more details.                      *
 *                                                                         *
 *   You should have received a copy of the GNU Library General Public     *
 *   License along with this library; if not, write to the Free Software   *
 *   Foundation, Inc., 59 Temple Place - Suite 330, Boston,                *
 *   MA 02111-1307, USA                                                    *
 ***************************************************************************/



#ifndef ANTS_SWITHER_HPP
#define ANTS_SWITHER_HPP

#include    <map>

#include    "ev/ev++.h"

#include    "help/logger.hpp"

#include    "ants/udpwatcher.hpp"
#include    "ants/queincome.hpp"

namespace   ants
{

class   Switcher
{

public  :
    Switcher();
    ~Switcher();
    
public  :
    void    run(void);
    
public  :
    //// helper methods
    void    setLogger(help::Logger*);
    
    
public  :
    void    watchUDP(int port);
    
private :
    void    callback_UDP(ev::io& watcher, int revent);
    void    callback_Signal(ev::sig& watcher, int revent);
    void    callback_idle(ev::idle& watcher, int revent);

private :
    void    enqueueRequest( void* pPacket ) { m_queueIncome.push(pPacket); }
    void*   dequeueRequest( void )  { return  m_queueIncome.pop(); }
        
    void*   getPacketBuffer( void );
    void    releasePacketBuffer(void*& pvPacket);
    
private :
    const char* evname(int event);
    
private :

    help::Logger&    logger(void) { return  *m_pLogger; }
    
    bool    debugable(void) const { return m_pLogger->debugable(); }

private :

    help::Logger*    m_pLogger;
    
    struct ev_loop* m_loop;
    
    typedef std::map<int, UdpWatcher*>    udpwatchers_type;
    udpwatchers_type     m_udpwatchers;
    
    ev::idle*   m_pIdle;
    
    QueueIncome     m_queueIncome;

};  // class Switcher
    
}   //namespace ants

#endif
